#include "singlechoicequestin.h"

#include <QVBoxLayout>
#include <QLabel>
#include <QJsonArray>



SingleChoiceQuestin::SingleChoiceQuestin(QObject *parent)
    : Question{parent}
{
    m_type = SingleChoice;  //父类的枚举值  这个对应的是单选
    m_typeString = u8"单选题";  // 设置题型字符串，用于分类显示
    m_typeId = TYPE_SINGLE_CHOICE;  // 设置题型ID为1（单选题）
}

bool SingleChoiceQuestin::fromJson(const QJsonObject &json)
{
    m_id = json.value("id").toInt(); //一道题的id
    m_stem = json.value("content").toString();//题文本内容

    // 解析正确答案
    m_correctAnswer = json["rightAnswer"].toString();

    // 解析每个题的所有选项 m_options存有选项
    if (json.contains("optionList") && json.value("optionList").isArray()) {
        QJsonArray optionArray = json.value("optionList").toArray();
        for (const QJsonValue &optionValue : optionArray) {
            if (optionValue.isObject()) {
                QJsonObject optionObj = optionValue.toObject();
                Option option;
                option.id = optionObj.value("id").toInt();
                option.code = optionObj.value("code").toString();
                option.content = optionObj.value("content").toString();
                if (option.id<=0 ) {
                    qWarning() << "选项ID为空或未找到:"<<option.id;
                    // 不直接返回false，只记录警告，继续处理其他选项
                    // 可以为无效ID设置一个默认值
                    option.id = m_options.size() + 1;
                }

                m_options.append(option);
            }
        }
    }
    return true;
}

QWidget *SingleChoiceQuestin::createWidget(QWidget *parent)
{
    QWidget *widget = new QWidget(parent);
    widget->setProperty("class", "question-container");
    QVBoxLayout *layout = new QVBoxLayout(widget);
    layout->setContentsMargins(10, 10, 10, 10);

    // Display stem
    QLabel *stemLabel = new QLabel(m_stem, widget);
    stemLabel->setWordWrap(true);
    stemLabel->setProperty("class", "question-stem-label");
    layout->addWidget(stemLabel);

    // 创建按钮组
    m_buttonGroup = new QButtonGroup(widget);

    // 创建选项按钮 - 使用m_options中的数据
    for (const Option &option : m_options) {
        QRadioButton *radioButton = new QRadioButton(
            QString("%1. %2").arg(option.code).arg(option.content),
            widget
            );

        // 设置选项ID属性
        radioButton->setProperty("optionId", option.id);
        m_buttonGroup->addButton(radioButton);

        // 如果这是用户答案，选中它
        if (QString::number(option.id) == m_userAnswer) {
            radioButton->setChecked(true);
        }

        layout->addWidget(radioButton);
    }

    // 连接信号，选项点击后记录id为答案
    connect(m_buttonGroup, QOverload<QAbstractButton *>::of(&QButtonGroup::buttonClicked),
            this, [this](QAbstractButton *button) {
                m_userAnswer = QString::number(button->property("optionId").toInt());
                emit answerChanged();
            });

    return widget;
}

// double SingleChoiceQuestion::calculateScore() const
// {

//     return (m_userAnswer == m_correctAnswer) ? m_maxScore : 0;
// }

// void SingleChoiceQuestion::setUserAnswer(const QString &answerId)
// {

// }

void SingleChoiceQuestin::onOptionSelected(int id)
{
    // 槽函数实现，可为空
}

QJsonObject SingleChoiceQuestin::toJson() const
{
    // 调用父类的toJson()获取基础信息
    QJsonObject json = Question::toJson();

    // 单选题特有数据
    json.insert("rightAnswer", m_correctAnswer);
    json.insert("studentAnswer", m_userAnswer);

    // 序列化选项列表
    QJsonArray optionArray;
    for (const Option &option : m_options) {
        QJsonObject optionObj;
        optionObj.insert("id", option.id);
        optionObj.insert("code", option.code);
        optionObj.insert("content", option.content);
        optionArray.append(optionObj);
    }
    json.insert("optionList", optionArray);

    return json;
}
